# test01_re.py
# 程序 = 数据结构(字典 {ip:该ip出现的次数...}) + 算法
# 0. dict01 = {k1:v1, k2:v2, .....}
#             {"192.168.1.100": 10, "192.168.1.200": 15, ....}
# 1. 按行读取文件, 在每一行数据中用户正则匹配出ip地址
# 2.1 如果该ip第一次访问服务器(该ip在原字典中没出现过)
#         - 给ip的出现次数一个初始值1  ---->  "192.168.1.100": 1
# 2.2 如果该ip已经访问过当前服务器了(该ip在原字典中出现过)
#         - 给ip的出现次数自增1
# 3. 将统计ip的字典返回
import re
# logpath:日志路径  patt_str:正则字符串
def count_ip(logpath, patt_str):
    count_dict = {}  # 存储结果数据
    patt = re.compile(patt_str)  # 编译正则表达式, patt正则对象
    with open(logpath, mode="r") as fr:
        for item in fr.readlines():  # for item in fr:
            result = patt.search(item)  # 在每一行数据中用户正则匹配出ip地址
            if result != None:  # 当行item中正则匹配成功时
                ip = result.group()  # 获取在行item中匹配到的字符串
                if ip in count_dict.keys():
                    count_dict[ip] += 1  # 给ip的出现次数自增1
                else:
                    count_dict[ip] = 1  # 给ip的出现次数一个初始值1
    return count_dict
if __name__ == '__main__':
    fname = "/opt/access.log"  # 日志的目录
    ip_patt = "(\d+\.){3}\d+"  # 匹配ip的正则字符串
    browser_patt = "Firefox|MSIE"  # 匹配浏览器的正则字符串
    result = count_ip(fname, ip_patt)  # 返回匹配字典
    print(result)
    result = count_ip(fname, browser_patt)
    print(result)
    # 192.    168.    13.     2
    # 数字点   数字点   数字点   数字      数字点{3}数字
    # \d+\.   \d+\.   \d+\.   \d+      (\d+\.){3}\d+
    # \d+:  \d: 数字   \d+:数字出现一次或多次





# 统计每个客户端(ip)访问服务器的次数
# 将统计信息通过字典的方式显示出来
# 分别统计客户端是 Firefox 和 MSIE 的访问次数



# [root@localhost tmp]# vim /opt/access.log
# [root@localhost tmp]# cat /opt/access.log
# 192.168.1.100 Firefox
# 192.168.2.100 MSIE
# 192.168.2.100 Firefox
# 192.168.3.100 MSIE
# 192.168.3.100 Firefox